package net.ib.mtalk.test.example;

import java.util.Random;

import net.ib.mtalk.database.DatabaseContract;
import net.ib.mtalk.database.DatabaseContract.BuddyTable;
import net.ib.mtalk.util.NotifyingAsyncQueryHandler;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.ListView;


/**
 * ChatON 의 구현 방식에 대한 Example 보여주는 class 이다.
 * 이 곳에서 사용한 방식들을 기반으로 작업을 진행할 예정이다.
 * 
 * @author namkhoh
 *
 */
public class ExampleListActivity extends FragmentActivity implements NotifyingAsyncQueryHandler.AsyncQueryListener{
	
	/**
	 * Asynchronous 하게 Database 작업을 요청할 수 있는 handler 
	 */
	private NotifyingAsyncQueryHandler mHandler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		

		/**
		 * xml file 에 class 를 지정해 layout 이 loading 되면서 바로 fragment class 를 load 해 사용하는 방법
		 */
//		setContentView(R.layout.example_layout);
		
		mHandler = new NotifyingAsyncQueryHandler(getContentResolver(), this);
		
		/**
		 * 동적으로 code 상에서 fragment manager 를 이용해 fragment 를 생성 commit 하는 방식
		 */
		FragmentManager fm = getSupportFragmentManager();
		if (fm.findFragmentById(android.R.id.content) == null) {
			ExampleFragmentList list = new ExampleFragmentList();
			fm.beginTransaction().add(android.R.id.content, list).commit();
		}
				
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add("ADD Buddy");
		return true;
	}
	
	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		if (item.getItemId()==0) {
			ContentValues cv = new ContentValues();
			Random ran = new Random();
			int ranNum = ran.nextInt();
//			cv.put(BuddyTable.KEY_BUDDY_NAME, ranNum+"");
//			cv.put(BuddyTable.KEY_BUDDY_NAME, ranNum+"");
			getContentResolver().insert(BuddyTable.CONTENT_URI, cv);
		}
		return true;

	}
	
	
	/**
	 * Fragment 를 이용해 View  Component 를 구현한다.
	 * {@link FragmentActivity}, {@link ListFragment} 를 참고</p>
	 * {@link Loader} 를 사용해 Asynchronous 한 Cursor loading
	 * @author namkhoh
	 *
	 */
	public static class ExampleFragmentList extends ListFragment 
			implements LoaderCallbacks<Cursor>{
	
		public static final String KEY_SELECT		=	"select";
		
		int mSelectedPosition = 0;
		
		private ListView listView;
		
		/**
		 * CusrorAdapter 를 사용하며 이를 위해 {@link SimpleCursorAdapter} 를 사용한다.
		 * Customize 해서 사용하고 싶으면 {@link CursorAdapter}를 상속받아 구현할 수 있다.</p>
		 * 
		 * 여기서 사용되는 SimpleCursorAdapter 는 android.support.v4 Package 에서 제공하는 CursorAdapter 이다.
		 * 기존 SimpleCursorAdapter 와의 차이점은 swapCursor 가 추가 (또 있을지도........??)
		 * 
		 */
		SimpleCursorAdapter mAdapter;
				
		
		/**
		 * View 가 바라볼 DataSet 에 대한 Uri 를 정의한다. 
		 */	
		Uri uri;

		
		
		/**
		 * onCreate 는 Fragment 가 생성될 떄 호출 된다.
		 * Fragment 의 Life Cycle 을 참고 
		 */
		@Override
		public void onCreate(Bundle savedInstanceState){
			super.onCreate(savedInstanceState);
			uri = DatabaseContract.BuddyTable.CONTENT_URI;	
			
			setRetainInstance(true);
		}	
		
		
		@Override
		public void onActivityCreated(Bundle savedInstanceState) {			
			super.onActivityCreated(savedInstanceState);
	
			/**
			 * mAdapter 를 생성한다. 이 경우 초기에 mAdapter 는 null 로 setting 한다.   
			 */
			mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1, 
										null, new String[]{DatabaseContract.BuddyTable._ID}, 
										new int[]{android.R.id.text1},
										0);			
			setListAdapter(mAdapter);
			
			/**
			 * 해당 View 에 해당되는 Cursor Loader 를 setting 한다.
			 * 
			 * Loader Class 의 장점
			 * 
			 * 1. 손쉽게 Asynchronous 한 Data loading 이 가능함
			 * 2. Cursor Loader 를 사용하는 경우 내부적으로 ContentObserver 처리를 자동으로 해준다. 
			 */
			
			getLoaderManager().initLoader(0, null, this);
		}
		
		@Override
		public void onResume() {
			super.onResume();
			listView = getListView();
		}

		
		/**
		 * List item 을 Click 하면 일어나는 Action 을 정의
		 */
		@Override
		public void onListItemClick(ListView l, View v, int position, long id) {
			
//			l.getAdapter().getItem(position)
			
			Cursor selectedCursor = ((Cursor)l.getAdapter().getItem(position)); 
			
//			String selectedName = selectedCursor.getString(selectedCursor.getColumnIndex(BuddyTable.KEY_BUDDY_NAME));
			/**
			 * Controller 를 이용해 View Action 에 대한 처리 작업을 한다. 
			 */
//			ExampleListController.showDetail(this, selectedName, position);			
		}
		

		/**
		 * Loader 를 init 하는 작업을 한다.
		 * Loader 의 id 에 대해서 분기가 가능하다. 
		 */
		@Override
		public Loader<Cursor> onCreateLoader(int id, Bundle args) {
			return new CursorLoader(getActivity(), uri, null, null, null, null) {
				@Override
				public void onContentChanged() {
					super.onContentChanged();
					listView.setSelection(mAdapter.getCount()+1);
				}
			};
		}

		@Override
		public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
			/**
			 * Asynchronous 얻어오는 Cursor 에 대하여 해당 DataSet 을 View Adapter 에 Set 해준다.  
			 * swapCursor 는 oldCursor 를 닫지 않는다. (oldCursor 는 Loader 에서 직접 관리)
			 */
			mAdapter.swapCursor(data);					
		}

		@Override
		public void onLoaderReset(Loader<Cursor> loader) {
			mAdapter.swapCursor(null);
		}
		
	}


	@Override
	public void onQueryComplete(int token, Object cookie, Cursor cursor) {
		
	}

	@Override
	public void onDeleteComplete(int token, Object cookie, int result) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onInsertComplete(int token, Object cookie, Uri uri) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onUpdateComplete(int token, Object cookie, int result) {
		// TODO Auto-generated method stub
		
	}
	

}
